package  code.ws_common_scene.map
{
	import code.ws_common_utils.UrlUtils;
	
	import flash.events.Event;
	import flash.geom.Point;
	import flash.net.URLRequest;
	import flash.net.URLStream;
	import flash.utils.ByteArray;
	import flash.utils.Dictionary;
	
	
	/**
	 * 地图模板文件
	 * @author qiangchen
	 * 
	 */	
	public class XMapMode
	{
		/** 回调方法 */
		private var _reFn:Function;
		/** cm字节流加载器对象 */
		private var _cmStream:URLStream=null;
		
		/** 当前地图id */
		public var _mapId:String;
		/** cm字节流数据对象 */
		public var _cmByte:ByteArray = null;
		/** 传送阵数据( 数据类型为object.每个object数据对象都有3个属性： nextMapId下一个场景的id；nextMapName下一个场景的名字；pos传送阵位置；transPos传送到下一个地图的位置) */
		public var _transInfos:Dictionary;
		/** 英雄在当前地图的初始化位置 */
		public var _heroIniPos:Point;
		/** 地图需加在的物件资源路径组 */
		public var _mapReses:Array = [];
		/** 怪物模型名字 */
		public var _monsterKinds:Array = [];
		/** 是否已加载地图中物件资源（包括：怪物动作模型、npc模型、场景特效模型等） */
		public var _hasLoader:Boolean = false;
		
		
		/**
		 * 构造函数 
		 * @param reFn
		 * 
		 */		
		public function XMapMode( reFn:Function )
		{
			_reFn = reFn;
		}
		
		
		/**
		 * 初始化 
		 * @param xml
		 * 
		 */		
		public function ini( xml:XML ):void
		{
			_mapId = xml.@mapId;
			
			// 传送阵数据
			_transInfos = new Dictionary();
			var trans_1:Array = xml.transInfo.split(";");
			for( var i:int=0; i<trans_1.length; i++ )
			{
				var obj:Object = new Object();
				var trans_2:Array = trans_1[i].split("#");
				obj.nextMapName = trans_2[1];
				obj.nextMapId = trans_2[2];
				var trans_3:Array = trans_2[0].split(",");
				obj.pos = new Point( trans_3[0], trans_3[1] );
				var trans_4:Array = trans_2[3].split(",");
				obj.transPos = new Point( trans_4[0], trans_4[1] );
				
				trans_2.length = trans_3.length = trans_4.length = 0; 
				trans_2 = trans_3 = trans_4 = null;
				
				// 添加
				_transInfos[obj.nextMapId] = obj;
			}
			trans_1.length = 0; trans_1 = null;
			
			// 英雄在当前地图的初始化位置 
			var iniPoses:Array = xml.heroIniPos.split(",");
			_heroIniPos = new Point( iniPoses[0], iniPoses[1] );
			iniPoses.length = 0; iniPoses = null;
			
			// 怪物名字组
			_monsterKinds = xml.monsterKinds.split(",");
			
			// 地图需加载资源路径组
			var monsterModes:Array = xml.monsterModes.split(";");
			for( var j:int=0; j<monsterModes.length; j++ )
			{
				_mapReses.push( UrlUtils.getMonsterUrl( monsterModes[j] ) );
			}
			monsterModes.length = 0; monsterModes = null;
			
			// cm文件解析
			_cmStream = new URLStream();
			_cmStream.addEventListener( Event.COMPLETE, cmComHandler );
			_cmStream.load( new URLRequest( UrlUtils.getMapCmUrl( _mapId, xml.cmName) ) );
		}
		
		
		
		/**
		 * 地图cm文件加载完毕 
		 * @param evt
		 * 
		 */		
		private function cmComHandler( evt:Event ):void
		{
			_cmStream.removeEventListener( Event.COMPLETE, cmComHandler );
			
			// 布置读取cm字节流
			_cmByte = new ByteArray();
			_cmStream.readBytes( _cmByte );
			
			// 释放流加载器
			_cmStream.close();
			_cmStream = null;
			
			if( _reFn != null )
			{
				_reFn.call( null, _mapId, this );
			}
		}
	}
}